package cn.kinoko.service.minio;

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;

/**
 * OssTemplate抽象API
 *
 * @author meng
 */
public interface MinioService {

    /**
     * 上传文件
     *
     * @param prefix      文件前缀
     * @param filename    文件名
     * @param contentType 文件类型
     * @param inputStream 文件流
     * @param datePrefix  是否添加日期前缀
     */
    String uploadFile(String prefix, String filename, String contentType, InputStream inputStream, boolean datePrefix);

    /**
     * 上传文件
     *
     * @param prefix         文件前缀
     * @param filename       文件名
     * @param contentType    文件类型
     * @param inputStream    文件流
     * @param datePrefix     是否添加日期前缀
     * @param timeStamp      是否添加时间戳前缀
     * @param buildThumbnail 是否生成缩略图
     */
    String uploadFile(String prefix, String filename, String contentType, InputStream inputStream, boolean datePrefix, boolean timeStamp, boolean buildThumbnail);

    /**
     * 批量上传
     *
     * @param prefix     文件前缀
     * @param files      文件列表
     * @param datePrefix 是否添加日期前缀
     */
    List<String> uploadBatch(String prefix, MultipartFile[] files, boolean datePrefix) throws IOException;

    /**
     * 删除文件
     *
     * @param pathUrl 文件路径
     */
    void deleteFile(String pathUrl);

    /**
     * 批量删除文件
     *
     * @param pathUrls 文件全路径
     */
    void deleteFiles(Collection<String> pathUrls);

    /**
     * 批量删除文件
     *
     * @param keys 文件key
     */
    void deleteFilesByKeys(Collection<String> keys);

    /**
     * 下载文件
     *
     * @param pathUrl 文件路径
     * @return 文件字节数组
     */
    byte[] downLoadFileByteArr(String pathUrl);

    /**
     * 下载文件
     *
     * @param pathUrl 文件路径
     * @return 文件输入流
     */
    InputStream downLoadFileIs(String pathUrl);

    /**
     * 保存文件引用
     *
     * @param pathUrls 文件路径
     */
    void saveFileReference(Collection<String> pathUrls);

    /**
     * 保存文件引用
     *
     * @param pathUrl 文件路径
     */
    void saveFileReference(String pathUrl);

    /**
     * 删除文件引用
     *
     * @param pathUrl 文件引用
     */
    void deleteFileReference(String pathUrl);

    /**
     * 删除文件引用
     *
     * @param pathUrls 文件引用
     */
    void deleteFileReference(Collection<String> pathUrls);

    /**
     * 清理无引用文件
     */
    void clearNoReferenceFile();
}